package com.bank.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bank.entity.TradeInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 交易信息数据访问层接口
 * 继承MyBatis Plus的BaseMapper，提供基础CRUD操作
 * 
 * @author 开发团队
 * @version 1.0.0
 * @since 2025-06-19
 */
@Mapper
public interface TradeInfoMapper extends BaseMapper<TradeInfo> {

    /**
     * 根据卡号查询交易记录
     * 
     * @param cardId 卡号
     * @return 交易记录列表
     */
    List<TradeInfo> selectByCardId(@Param("cardId") String cardId);

    /**
     * 根据交易类型查询交易记录
     * 
     * @param tradeType 交易类型
     * @return 交易记录列表
     */
    List<TradeInfo> selectByTradeType(@Param("tradeType") String tradeType);

    /**
     * 根据交易时间范围查询交易记录
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 交易记录列表
     */
    List<TradeInfo> selectByTradeTimeRange(@Param("startTime") LocalDateTime startTime, 
                                          @Param("endTime") LocalDateTime endTime);

    /**
     * 根据交易金额范围查询交易记录
     * 
     * @param minAmount 最小金额
     * @param maxAmount 最大金额
     * @return 交易记录列表
     */
    List<TradeInfo> selectByAmountRange(@Param("minAmount") BigDecimal minAmount, 
                                       @Param("maxAmount") BigDecimal maxAmount);

    /**
     * 分页查询交易记录（支持多条件组合查询，关联银行卡和客户信息）
     * 
     * @param page 分页参数
     * @param cardId 卡号（可选，精确查询）
     * @param customerName 客户姓名（可选，模糊查询）
     * @param tradeType 交易类型（可选）
     * @param startTime 交易开始时间（可选）
     * @param endTime 交易结束时间（可选）
     * @param minAmount 最小金额（可选）
     * @param maxAmount 最大金额（可选）
     * @return 分页结果
     */
    IPage<TradeInfo> selectPageWithConditions(Page<TradeInfo> page,
                                             @Param("cardId") String cardId,
                                             @Param("customerName") String customerName,
                                             @Param("tradeType") String tradeType,
                                             @Param("startTime") LocalDateTime startTime,
                                             @Param("endTime") LocalDateTime endTime,
                                             @Param("minAmount") BigDecimal minAmount,
                                             @Param("maxAmount") BigDecimal maxAmount);

    /**
     * 根据卡号分页查询交易记录（客户查询自己的交易记录）
     * 
     * @param page 分页参数
     * @param cardId 卡号
     * @param tradeType 交易类型（可选）
     * @param startTime 交易开始时间（可选）
     * @param endTime 交易结束时间（可选）
     * @return 分页结果
     */
    IPage<TradeInfo> selectPageByCardId(Page<TradeInfo> page,
                                       @Param("cardId") String cardId,
                                       @Param("tradeType") String tradeType,
                                       @Param("startTime") LocalDateTime startTime,
                                       @Param("endTime") LocalDateTime endTime);

    /**
     * 获取交易统计信息
     * 
     * @return 交易总数
     */
    int selectTotalCount();

    /**
     * 根据交易类型统计交易数量
     * 
     * @param tradeType 交易类型
     * @return 交易数量
     */
    int countByTradeType(@Param("tradeType") String tradeType);

    /**
     * 根据交易类型统计交易金额
     * 
     * @param tradeType 交易类型
     * @return 交易金额总和
     */
    BigDecimal sumAmountByTradeType(@Param("tradeType") String tradeType);

    /**
     * 获取指定时间范围内的交易统计
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果列表
     */
    List<Map<String, Object>> selectTradeStatistics(@Param("startTime") LocalDateTime startTime,
                                                    @Param("endTime") LocalDateTime endTime);

    /**
     * 获取月度交易汇总统计
     * 
     * @param year 年份
     * @param month 月份
     * @return 月度统计结果
     */
    List<Map<String, Object>> selectMonthlyStatistics(@Param("year") Integer year, 
                                                      @Param("month") Integer month);

    /**
     * 获取银行卡交易额统计（用于报表）
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 银行卡交易额统计
     */
    List<Map<String, Object>> selectCardTradeAmountStatistics(@Param("startTime") LocalDateTime startTime,
                                                              @Param("endTime") LocalDateTime endTime);

    /**
     * 调用转账存储过程
     *
     * @param fromCardId 转出卡号
     * @param toCardId 转入卡号
     * @param amount 转账金额
     * @param remark 备注
     * @return 执行结果（0-成功，其他-失败）
     */
    Integer callTransferProcedure(@Param("fromCardId") String fromCardId,
                                 @Param("toCardId") String toCardId,
                                 @Param("amount") BigDecimal amount,
                                 @Param("remark") String remark);

    /**
     * 批量删除交易记录
     * 
     * @param tradeIds 交易ID列表
     * @return 影响行数
     */
    int batchDeleteByIds(@Param("tradeIds") List<Integer> tradeIds);
}
